﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DECOR.BL.BE;
using DECOR.DL.DALCF;

namespace DECOR.BL.BC
{
    public class PedidoBC
    {
        #region Singleton
        private PedidoBC() { }
        private static PedidoBC _instance = null;
        public static PedidoBC Instance
        {
            get { return (_instance == null) ? _instance = new PedidoBC() : _instance; }
        }
        #endregion

        /// <summary>
        /// Devuelve el plan de facturación.
        /// </summary>
        public List<PlanFactBE> getPlanFact(string pNumPedido, out List<CatFactBE> pt_CatFactBE)
        {
            List<PlanFactBE> pf = DaoFactory.PedidoDALC.getPlanFact(pNumPedido, out  pt_CatFactBE);
            return pf;
        }

        /// <summary>
        /// Graba, actualiza o borra el plan de facturación.
        /// </summary>
        public string setPlanFact(string pNumPedido, List<PlanFactBE> lst_PlanFactBE, bool esCreacion)
        {

            return DaoFactory.PedidoDALC.setPlanFact(pNumPedido, lst_PlanFactBE, esCreacion);
        }

        /// <summary>
        /// Genera una orden de servicio dependiendo de los codigos en el arreglo
        /// </summary>
        public string generarServicio(out string pNumPedido, List<string> pLstServ, List<string> pLstVisita)
        {
            return DaoFactory.PedidoDALC.generarServicio(out pNumPedido, pLstServ, pLstVisita);
        }

        //public List<GlosaBE> glosasCotizacion(List<string> pLstMat, DateTime fecha)
        public List<GlosaBE> glosasCotizacion(string numPedido) //rgutierrez 18.11.2011
        {
            return DaoFactory.PedidoDALC.glosasCotizacion(numPedido); //rgutierrez 18.11.2011
            //return DaoFactory.PedidoDALC.glosasCotizacion(pLstMat, fecha); 
        }

        //rgutierrez 27.01.2012
        //public List<GlosaBE> ObtenerGlosasA4(string numPedido)
        //{
        //    return DaoFactory.PedidoDALC.ObtenerGlosasA4(numPedido);
        //}

        public List<InstalaBE> listadoInstalacion(string pNumDoc)
        {

            return DaoFactory.PedidoDALC.ListadoInstalacion(pNumDoc);
        }


        public string procesarPedido(out string pNumPedido, PedidoBE pObjPedido)
        {
            string email = pObjPedido.Mail;
            string result = "";
            result = DaoFactory.PedidoDALC.procesarPedido(out pNumPedido, pObjPedido);

            if (pNumPedido.Trim() != "")
            {
                string auxMod = "";
                bool pOkModif = true;
                //--- @Fix para precios en pedidos de servicio...
                InterlocutorBE objSolicitante = pObjPedido.Interlocutores.Find(delegate(InterlocutorBE obj) { return obj.Funcion == DaoFactory.ParametroDALC.getParamValue("IlocCliente"); });
                InterlocutorBE objResPago = pObjPedido.Interlocutores.Find(delegate(InterlocutorBE obj) { return obj.Funcion == DaoFactory.ParametroDALC.getParamValue("IlocResPago"); });
                pObjPedido = leer(pNumPedido.Trim(), false);
                pObjPedido.Mail = email;
                if (DaoFactory.ParametroDALC.esTipoXY(pObjPedido.CodTipoDoc, "CodPedModif")) //rgutierrez 01.12.2011 El correo ya se guarda en la creación
                {
                    pObjPedido.NumPedido = pNumPedido;
                    string strRucAG = objSolicitante.Cliente.Ruc;
                    pObjPedido.Interlocutores.Find(delegate(InterlocutorBE obj) { return obj.Funcion == DaoFactory.ParametroDALC.getParamValue("IlocCliente"); }).Cliente.Ruc = strRucAG;
                    strRucAG = objResPago.Cliente.Ruc;
                    pObjPedido.Interlocutores.Find(delegate(InterlocutorBE obj) { return obj.Funcion == DaoFactory.ParametroDALC.getParamValue("IlocResPago"); }).Cliente.Ruc = strRucAG;

                    foreach (DetalleBE item in pObjPedido.Detalle)
                    {
                        item.Peso = item.Peso / item.Cantidad; // 23.08.2011 : se agregó para sacar la el peso unitario.
                        item.TipoPosicion = string.Empty;
                        if (!DaoFactory.ParametroDALC.esTipoXY(pObjPedido.CodTipoDoc, "CodOferta"))
                            item.Repartos.Clear();
                    }

                    auxMod = DaoFactory.PedidoDALC.modificar(out pOkModif, pObjPedido);
                    result = auxMod;
                }
            }

            return result;

        }

        public PedidoBE leer(string pNumPedido)
        {
            PedidoBE retObj = DaoFactory.PedidoDALC.leer(pNumPedido.PadLeft(10, '0'), false);
            if (retObj != null)
            {
                //AHORA SE LEE ACA Y NO EN EL LEER PEDIDODALC
                List<InterlocutorBE> lstInterlocutores = new List<InterlocutorBE>();
                lstInterlocutores = DaoFactory.PedidoDALC.listaInterlocutores(pNumPedido);
                retObj.Interlocutores = lstInterlocutores;
                //--- cargar cantidades de componente:, viene de pedidodalc
                string tpos = "";
                foreach (DetalleBE objTmpDet in retObj.Detalle)
                {
                    if (objTmpDet.PosSupCorto == "0" || objTmpDet.PosSupCorto == "")
                    {
                        List<DetalleBE> lstHijos = DaoFactory.PedidoDALC.buscaTipoPosicion(retObj.CodTipoDoc, objTmpDet.CodMaterial, retObj.OrgVentas, retObj.CanalDist, objTmpDet.CodCentro, out tpos);
                        foreach (DetalleBE itmHijo in lstHijos)
                        {
                            List<DetalleBE> lstAux = retObj.Detalle.FindAll(X => X.CodMaterial == itmHijo.CodMaterial);
                            foreach (DetalleBE itmAux in lstAux)
                            {
                                itmAux.CantComp = itmHijo.CantComp;
                            }
                        }
                    }
                }
                //-- carga info de materiales
                foreach (DetalleBE itm in retObj.Detalle)
                {
                    MaterialBE objMat = MaterialBC.Instance.leerMaterial(itm.CodMaterial, retObj.OrgVentas, retObj.CanalDist);
                    if (objMat != null)
                    {
                        if (itm.DescMaterial.Equals(""))
                            itm.DescMaterial = objMat.DescMaterial;

                        itm.CodUMedida = objMat.CodUMedida;
                        itm.UMedidaRendimiendo = objMat.UMedidaRendimiendo;
                        itm.ValorRendimiento = objMat.ValorRendimiento;
                        itm.Peso = objMat.Peso;
                        itm.TipoMaterial = objMat.TipoMaterial;

                        //--- material
                        itm.Material = objMat;
                    }
                    else
                    {
                        itm.DescMaterial = "Material " + itm.CodMaterial + " no existe o ha sido marcado para borrar.";
                    }
                }
                retObj.TipoCambio = ParametroBC.Instance.getTipoCambio(retObj.Fecha);
            }
            return retObj;
        }

        public PedidoBE leer(string pNumPedido, bool pLight)
        {
            PedidoBE retObj = DaoFactory.PedidoDALC.leer(pNumPedido.PadLeft(10, '0'), pLight);
            if (retObj != null)
            {
                //AHORA SE LEE ACA Y NO EN EL LEER PEDIDODALC
                List<InterlocutorBE> lstInterlocutores = new List<InterlocutorBE>();
                lstInterlocutores = DaoFactory.PedidoDALC.listaInterlocutores(pNumPedido);
                retObj.Interlocutores = lstInterlocutores;
                //-- carga info de materiales
                foreach (DetalleBE itm in retObj.Detalle)
                {
                    MaterialBE objMat = MaterialBC.Instance.leerMaterial(itm.CodMaterial, retObj.OrgVentas, retObj.CanalDist);
                    if (objMat != null)
                    {
                        itm.DescMaterial = objMat.DescMaterial;
                        itm.CodUMedida = objMat.CodUMedida;
                        itm.UMedidaRendimiendo = objMat.UMedidaRendimiendo;
                        itm.ValorRendimiento = objMat.ValorRendimiento;
                        itm.Peso = objMat.Peso;
                        itm.TipoMaterial = objMat.TipoMaterial;

                        //--- material
                        itm.Material = objMat;
                    }
                    else
                    {
                        itm.DescMaterial = "Material " + itm.CodMaterial + " no existe o ha sido marcado para borrar.";
                    }
                }
                retObj.TipoCambio = ParametroBC.Instance.getTipoCambio(retObj.Fecha);
            }
            return retObj;
        }

        public string modificar(out bool pOk, PedidoBE pObjPedido)
        {
            return DaoFactory.PedidoDALC.modificar(out pOk, pObjPedido);
        }

        public string reaprovisionar(out bool pOk, PedidoBE pObjPedido)
        {
            return DaoFactory.PedidoDALC.reaprovisionar(out pOk, pObjPedido);
        }

        /// <summary>
        /// Ejecuta Zweb_Calcular_Precio
        /// </summary>
        /// <param name="pObjPedido"></param>
        /// <returns></returns>
        public string cargarCondiciones(ref PedidoBE pObjPedido)
        {
            string mensaje = "", retval = "";
            List<DetalleBE> lstDetalle = new List<DetalleBE>();

            //@rgutierrez 09.11.2011
            decimal importeTotal = 0;

            decimal dsctoZD12 = 0m;

            foreach (DetalleBE objDetalle in pObjPedido.Detalle)
            {
                DetalleBE pObjDetalle = objDetalle;

                if (!ParametroBC.Instance.esTipoPosCombo(objDetalle.TipoPosicion) && !ParametroBC.Instance.esTipoCabKit(objDetalle.TipoPosicion))
                {
                    //rgutierrez 13.01.2012 Ya se considera al grabar el pedido
                    //if (!(pObjDetalle.DctoDecorPorc.ImporteAnterior == 0))
                    //    if ((Math.Abs(pObjDetalle.DctoDecorPorc.ImporteAnterior) == Math.Abs(pObjDetalle.DctoDecorPorc.Importe)))
                    //        if (ParametroBC.Instance.esTipoX(pObjPedido.CondPago, "descCD"))// && !pObjPedido.GrupoCond.Equals(""))
                    //        {
                    //            objDetalle.DctoDecorPorc.Importe = Math.Abs(objDetalle.DctoDecorPorc.Importe);
                    //            if (objDetalle.DctoDecorPorc.Importe > 0)
                    //            {
                    //                objDetalle.DctoDecorPorc.Importe += 3;
                    //            }
                    //        }
                    List<DescuentoBE> lstDescuentos = DaoFactory.PedidoDALC.calcularPrecios(pObjPedido, objDetalle, out retval);

                    mensaje += (retval != string.Empty ? retval + "\r\n" : "");
                    #region asignando condiciones
                    //si todo OK
                    DescuentoBE objPrecio = lstDescuentos.Find(delegate(DescuentoBE dcto) { return (dcto.Condicion == ParametroBC.Instance.getParamValue("CondPrecio")); });
                    string lv_condpre = ParametroBC.Instance.getParamValue("CondPrecios");
                    string[] lt_condpre = lv_condpre.Split(',');
                    foreach (string ls_condpre in lt_condpre)
                    {
                        if (objPrecio == null)
                        { objPrecio = lstDescuentos.Find(X => X.Condicion == ls_condpre); }
                        else { break; }
                    }
                    pObjDetalle.Precio = (objPrecio == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondPrecio")) : objPrecio);
                    //buscar en secuencia zp00, zp03, zp04, zp05

                    DescuentoBE objDiferencia = lstDescuentos.Find(X => X.Condicion == ParametroBC.Instance.getParamValue("CondPrecio1"));
                    pObjDetalle.Diferencia = objDiferencia == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondPrecio1")) : objDiferencia;

                    DescuentoBE objIgv = lstDescuentos.Find(delegate(DescuentoBE dcto) { return (dcto.Condicion == ParametroBC.Instance.getParamValue("CondIgv")); });
                    pObjDetalle.Igv = (objIgv == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondIgv")) : objIgv);

                    //carga percepciones
                    DescuentoBE objPercep = lstDescuentos.Find(X => X.Condicion == "ZPRC");
                    pObjDetalle.Percepcion = (objPercep == null ? new DescuentoBE("ZPRC") : objPercep);
                    //carga percepciones

                    // if (pObjPedido.CodOficina != "1060")
                    // {
                    DescuentoBE objDctoDecorPorc = lstDescuentos.Find(delegate(DescuentoBE dcto) { return (dcto.Condicion == ParametroBC.Instance.getParamValue("CondDctoDecorPorc")); });
                    pObjDetalle.DctoDecorPorc = (objDctoDecorPorc == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondDctoDecorPorc")) : objDctoDecorPorc);
                    //}
                    DescuentoBE objDctoAdicionalPorc = lstDescuentos.Find(delegate(DescuentoBE dcto) { return (dcto.Condicion == ParametroBC.Instance.getParamValue("CondDctoAdicionalPorc")); });
                    pObjDetalle.DctoAdicionalPorc = (objDctoAdicionalPorc == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondDctoAdicionalPorc")) : objDctoAdicionalPorc);
                    //---
                    DescuentoBE objDctoEstadisticoPorc = lstDescuentos.Find(delegate(DescuentoBE dcto) { return (dcto.Condicion == ParametroBC.Instance.getParamValue("CondDctoEstadisticoPorc")); });
                    pObjDetalle.DctoEstadisticoPorc = (objDctoEstadisticoPorc == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondDctoEstadisticoPorc")) : objDctoEstadisticoPorc);

                    DescuentoBE objDctoGerenciaPorc = lstDescuentos.Find(delegate(DescuentoBE dcto) { return (dcto.Condicion == ParametroBC.Instance.getParamValue("CondDctoGerenciaPorc")); });
                    pObjDetalle.DctoGerenciaPorc = (objDctoGerenciaPorc == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondDctoGerenciaPorc")) : objDctoGerenciaPorc);

                    DescuentoBE objDctoGerenciaMonto = lstDescuentos.Find(delegate(DescuentoBE dcto) { return (dcto.Condicion == ParametroBC.Instance.getParamValue("CondDctoGerenciaMonto")); });
                    pObjDetalle.DctoGerenciaMonto = (objDctoGerenciaMonto == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondDctoGerenciaMonto")) : objDctoGerenciaMonto);
                    //---
                    DescuentoBE objDctoZD06 = lstDescuentos.Find(X => X.Condicion == ParametroBC.Instance.getParamValue("CondZD06"));
                    pObjDetalle.DctoZD06 = objDctoZD06 == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondZD06")) : objDctoZD06;
                    DescuentoBE objDctoZD07 = lstDescuentos.Find(X => X.Condicion == ParametroBC.Instance.getParamValue("CondZD07"));
                    pObjDetalle.DctoZD07 = objDctoZD07 == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondZD07")) : objDctoZD07;

                    //rgutierrez 10.01.2011
                    DescuentoBE objDctoGenerico = lstDescuentos.Find(X => X.Condicion == ParametroBC.Instance.getParamValue("CondDctos")); //ZD09
                    pObjDetalle.DctoGenerico = objDctoGenerico == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondDctos")) : objDctoGenerico;
                    DescuentoBE objDctoZD11 = lstDescuentos.Find(X => X.Condicion == ParametroBC.Instance.getParamValue("CondZD11"));
                    pObjDetalle.DctoZD11 = objDctoZD11 == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondZD11")) : objDctoZD11;
                    //rhuapaya 27.06.2012 @@@ acumulo el ZD12
                    DescuentoBE objDctoZD12 = lstDescuentos.Find(X => X.Condicion == ParametroBC.Instance.getParamValue("CondDctosAdicional"));
                    pObjDetalle.DsctoAdicionalZD12 = objDctoZD12 == null ? new DescuentoBE(ParametroBC.Instance.getParamValue("CondDctosAdicional")) : objDctoZD12;
                    dsctoZD12 = dsctoZD12 + pObjDetalle.DsctoAdicionalZD12.Valor;
                    //@rgutierrez 09.11.2011
                    importeTotal = importeTotal + objDetalle.PrecioTotal;
                    // if (pObjDetalle.Total  > 700){
                    if (pObjDetalle.Percepcion.Importe == 0)
                    {

                        pObjDetalle.TotPercep = pObjDetalle.Total * pObjDetalle.Percepcion.Valor / 100;
                    }
                    else
                    {
                        pObjDetalle.TotPercep = pObjDetalle.Percepcion.Importe;
                    }
                    //  }
                    #endregion

                }
                lstDetalle.Add(pObjDetalle);
            }

            //@rgutierrez 09.11.2011
            if (importeTotal != 0)
            {
                foreach (DetalleBE pObjDetalle in pObjPedido.Detalle)
                {
                    pObjDetalle.DctoGenericoZD08.Valor = _descuentoTotal * pObjDetalle.PrecioTotal / importeTotal;

                }
            }
            //******************************************************************************
            //rhuapaya 27.06.2012 @@@ se asigna el total del ZD12 para todos los detalles
            pObjPedido.dsctoAdicionalZD12 = dsctoZD12;
            //******************************************************************************
            //actualizar lista de detalle con las condiciones cargadas...
            pObjPedido.Detalle = lstDetalle;

            return mensaje;
        }

        public List<GenericBE> listaCondicionesExp()
        {
            return DaoFactory.CondicionDALC.listaCondicionesExpedicion();
        }

        public StatusBE verStatus(string pNumPedido)
        {
            return DaoFactory.PedidoDALC.verStatus(pNumPedido);
        }
        public List<EntregaBE> verEntrega(string pVbeln, string pvbtyp_n)
        {
            return DaoFactory.PedidoDALC.verEntrega(pVbeln, pvbtyp_n);
        }

        public List<SeguimientoBE> buscaDocumentos(string pNumPedido)
        {
            return DaoFactory.PedidoDALC.buscaDocumentos(pNumPedido.PadLeft(10, '0'));
        }

        public void buscaDatosImpresion(string pNumPedido, out string pDireccion, out string pTelefono, out string pFax, out string pAtencion)
        {
            DaoFactory.PedidoDALC.buscaDatosImpresion(pNumPedido.PadLeft(10, '0'), out pDireccion, out pTelefono, out pFax, out pAtencion);
        }

        public List<GenericBE> listarMotivosRechazo()
        {
            return DaoFactory.PedidoDALC.buscarMotivosRechazo("");
        }

        public List<DetalleBE> buscaTipoPosicion(string pCodTipoDoc, string pCodMaterial, string pOrgVtas,
                                                string pCanalDist, out string pTipoPos)
        {

            string pCentro = pOrgVtas == "1000" ? "9110" : "2010";
            List<DetalleBE> lstDet = DaoFactory.PedidoDALC.buscaTipoPosicion(pCodTipoDoc, pCodMaterial, pOrgVtas, pCanalDist, pCentro, out pTipoPos);
            foreach (DetalleBE item in lstDet)
            {
                item.Material = DaoFactory.MaterialDALC.leerMaterial(item.CodMaterial, pOrgVtas, pCanalDist, "");
            }
            return lstDet;
        }

        public List<PedidoBE> listaPedidos(string pNumDoc, string pCodUsuario, DateTime pFecInicio, DateTime pFecFin, string pOrgVtas,
                                           string pCanal, string pOficina, string pRefLegal)
        {
            return DaoFactory.PedidoDALC.listaPedidos(pNumDoc, pCodUsuario.PadLeft(8, '0'), pFecInicio, pFecFin, pOrgVtas, pCanal, pOficina, pRefLegal);
        }

        public List<PedidoBE> listaPedidos(string pNumDoc, string pCodUsuario, DateTime pFecInicio, DateTime pFecFin,
                                           string pOrgVtas, string pCanal, string pOficina, string pRefLegal,
                                           string pMatrn, string pNombCli, string pStceg, string pDescMater, string pCodCli)
        {

            return DaoFactory.PedidoDALC.listaPedidos(pNumDoc, pCodUsuario, pFecInicio, pFecFin,
                                            pOrgVtas, pCanal, pOficina, pRefLegal,
                                            pMatrn, pNombCli, pStceg, pDescMater, pCodCli);

        }
        /// <summary>
        /// Reporte de fletes y estiba
        /// </summary>
        /// <param name="pTipoRep"></param>
        /// <param name="pAgrupacion"></param>
        /// <param name="pOficina"></param>
        /// <param name="pFecIni"></param>
        /// <param name="pFecFin"></param>
        /// <returns></returns>
        public List<FleteBE> listaFleteEstiba(string pTipoRep, string pAgrupacion, string pOficina, DateTime pFecIni, DateTime pFecFin)
        {
            return DaoFactory.PedidoDALC.ListaFleteEstiba(pTipoRep, pAgrupacion, pOficina, pFecIni, pFecFin);
        }

        /// <summary>
        /// Reporte de fletes y estiba 2
        /// </summary>
        /// <param name="pTipoRep"></param>
        /// <param name="pOficina"></param>
        /// <param name="pFecIni"></param>
        /// <param name="pFecFin"></param>
        /// <returns></returns>
        public List<FleteBE> listaOpFleteEstiba(string pTipoRep, string pOficina, DateTime pFecIni, DateTime pFecFin)
        {
            return DaoFactory.PedidoDALC.ListaOpFleteEstiba(pTipoRep, pOficina, pFecIni, pFecFin);
        }

        /// <summary>
        /// Valida que la copia sea permitida
        /// </summary>
        /// <param name="pNumDoc">Número de documento Original</param>
        /// <param name="pTipoDoc">Tipo de documento a crear</param>
        /// <returns>S = si se puede  N = No se puede</returns>
        public string validaCopia(string pNumDoc, string pTipoDoc)
        {
            return DaoFactory.PedidoDALC.validaCopia(pNumDoc, pTipoDoc);

        }
        /// <summary>
        /// Devuelve lista de pedidos con detalle de cantidades pendientes de despacho.
        /// </summary>
        /// <param name="pNumPedido">número de pedido</param>
        /// <param name="pFecIni">fecha reparto: inicio</param>
        /// <param name="pFecFin">fecha reparto: fin</param>
        /// <param name="pCodAsesor">código del asesor ó * para todos</param>
        /// <param name="pOrgVentas">organización de ventas</param>
        /// <param name="pCanalDist">canal de distribución ó ventas</param>
        /// <param name="pOfVentas">oficina de ventas</param>
        /// <returns></returns>
        public List<PedidoPosBE> ListaPendDesp(string pNumPedido, DateTime pFecIni, DateTime pFecFin, string pCodAsesor,
                                               string pOrgVentas, string pCanalDist, string pOfVentas)
        {
            if (pCodAsesor == "*")
            {
                pCodAsesor = "0";
            }

            return DaoFactory.PedidoDALC.ListaPendDesp(pNumPedido, pFecIni, pFecFin, pCodAsesor, pOrgVentas, pCanalDist, pOfVentas);
        }

        //@rgutierrez 09.11.2011
        private decimal _descuentoTotal;
        public decimal DescuentoTotal
        {
            get { return _descuentoTotal; }
            set { _descuentoTotal = value; }
        }

        //@rgutierrez 15.11.2011
        public void ActualizarPosiciones(PedidoBE pObjPedido)
        {
            //cambiar cantidades del combo / kit
            decimal cantAux = 0m;
            foreach (DetalleBE tmpDetalleBE in pObjPedido.Detalle)
            {
                List<DetalleBE> lstAux = pObjPedido.Detalle.FindAll(X => X.PosSup == tmpDetalleBE.Posicion);
                //--- si tiene items (es cabecera kit/combo)
                if (lstAux.Count > 0 && ParametroBC.Instance.esTipoX(tmpDetalleBE.TipoPosicion, "TipoCabCombo")) //Solo modificar cantidades si es cabecera de combo
                //if (lstAux.Count > 0)
                {
                    //--- si la cantidad anterior es distinta a la actual:
                    //if (tmpDetalleBE.CantComp != tmpDetalleBE.Cantidad)
                    {

                        foreach (DetalleBE itmAux in lstAux)
                        {
                            //FST 02/09/2013 CantModIncorr: No permite reducir las cantidades en el momento del recalculo en materiales combo
                            //cantAux = itmAux.Cantidad;
                            cantAux = tmpDetalleBE.Cantidad;
                            //-------------------------------------------------------------------------------------------------
                            itmAux.Cantidad = itmAux.CantComp * tmpDetalleBE.Cantidad;

                            //si UM = UNidad => redondear al entero mayor
                            if (ParametroBC.Instance.esTipoX(itmAux.CodUMedida, "UMUnidad"))
                            {
                                itmAux.Cantidad = (itmAux.Cantidad > decimal.Truncate(itmAux.Cantidad)) ? decimal.Truncate(itmAux.Cantidad) + 1 : itmAux.Cantidad;
                                if (cantAux > itmAux.Cantidad)
                                {
                                    cantAux = (cantAux > decimal.Truncate(cantAux)) ? decimal.Truncate(cantAux) + 1 : cantAux;
                                    itmAux.Cantidad = cantAux;
                                }
                            }
                            else //para unidades ML y M2
                            {
                                if (cantAux > itmAux.Cantidad)
                                {
                                    itmAux.Cantidad = cantAux;
                                }
                            }

                            if (itmAux.Material == null)
                            {
                                itmAux.Material = MaterialBC.Instance.leerMaterial(itmAux.CodMaterial, pObjPedido.OrgVentas, pObjPedido.CanalDist);
                            }
                            //--- calcular rendimiento
                            if (!ParametroBC.Instance.esTipoX(itmAux.Material.Tipo, "TipoMatServicio") &&
                                ParametroBC.Instance.esTipoX(itmAux.Material.UMedidaRendimiendo, "UMRendimiento"))
                            {
                                itmAux.Cantidad = calculaRendimiento(itmAux.Cantidad, itmAux.ValorRendimiento);
                            }

                            //--- cambiar cantidades de reparto si solo hay un reparto:
                            //if (itmAux.Repartos.Count == 1)
                            if (itmAux.Repartos.Count == 1 || pObjPedido.CodTipoDoc == "Z037") //rgutierrez 16.11.2011
                            {
                                itmAux.Repartos[0].CantPed = itmAux.Cantidad;
                                itmAux.Repartos[0].CantConf = itmAux.Cantidad;
                            }
                        }
                        //-- guardo la cantidad en otra variable (cantidad antigua)
                        tmpDetalleBE.CantComp = tmpDetalleBE.Cantidad;
                    }
                }
                //--- cambiar cantidades de reparto si solo hay un reparto:
                //if (tmpDetalleBE.Repartos.Count == 1)
                if (tmpDetalleBE.Repartos.Count == 1 || pObjPedido.CodTipoDoc == "Z037") //rgutierrez 16.11.2011 No guardaba la cantidad modificada
                {
                    if (!ParametroBC.Instance.esTipoX(pObjPedido.CodTipoDoc, "CodNCND"))
                    {
                        tmpDetalleBE.Repartos[0].CantPed = tmpDetalleBE.Cantidad;
                        tmpDetalleBE.Repartos[0].CantConf = tmpDetalleBE.Cantidad;
                    }
                }
            }
            //---- fin cambio cantidades
        }
        //rgutierrez 15.11.2011
        public decimal calculaRendimiento(decimal pCant, decimal pRend)
        {
            if (pRend != 0m)
            {
                decimal residuo = pCant % pRend, ajuste = 0m;
                if (residuo != 0) { ajuste = 1m; }
                decimal nuevaCant = (Math.Truncate(pCant / pRend) + ajuste) * pRend;
                return decimal.Round(nuevaCant, ParametroBC.Instance.getDecimales);
            }
            return decimal.Round(pCant, ParametroBC.Instance.getDecimales);
        }

        public List<PedidoCabeceraBE> listaPedidoCabeceraDetalle(string pNumDoc, string pCodUsuario,
            DateTime pFecInicio, DateTime pFecFin, string pOrgVtas, string pCanal, string pOficina,
            string pRefLegal, string pMatrn, string pNombCli, string pStceg, string pDescMater,
            string pCodCli, out List<PedidoDetalleBE> lstDetalleBE, string pTipoDocumento)
        {
            return DaoFactory.PedidoDALC.listaPedidoCabeceraDetalle(pNumDoc, pCodUsuario, pFecInicio, pFecFin,
                pOrgVtas, pCanal, pOficina, pRefLegal, pMatrn, pNombCli, pStceg,
                pDescMater, pCodCli, out lstDetalleBE, pTipoDocumento);
        }
    }
}
